//
//  Status.swift
//  MyWeiboApp
//
//  Created by 胡海波 on 15/7/1.
//  Copyright © 2015年 胡海波. All rights reserved.
//

import UIKit
import AFNetworking
import SDWebImage

///  访问微博首页 URL
private let WB_Home_TimeLine_URL = "2/statuses/home_timeline.json"

class Status: NSObject {

    // MARK: - 定义数据模型属性
    /// 微博创建时间
    var created_at:	String?

    /// 微博ID
    var id: Int = 0

    /// 微博信息内容
    var text:String?

    /// 微博来源
    var source:String?

    /// 配图数组
    var pic_urls: [[String: String]]? {
        didSet {
            // 设置imageURLs 的数组
            imageURLs = [NSURL]()

            largeImageURLs = [NSURL]()

            // 生成并且添加 url
            for dict in pic_urls! {

                var urlString = dict["thumbnail_pic"]!
                imageURLs?.append(NSURL(string: urlString)!)

                urlString = urlString.stringByReplacingOccurrencesOfString("thumbnail", withString: "large")

                largeImageURLs?.append(NSURL(string: urlString)!)

            }
        }
    }

    /// 配图的 URL 数组
    private var imageURLs: [NSURL]?

    /// 配图的计算型 数组,如果是转发微博返回转发微博的配图，否则返回原创微博配图
    var calPictureURLs: [NSURL]? {

        return retweeted_status != nil ? retweeted_status?.imageURLs : imageURLs
    }

     /// 大图 的URL
    private var largeImageURLs: [NSURL]?

     /// 计算不同类型微博大图的URL
    var calLargeImageURLs: [NSURL]? {

        return retweeted_status != nil ? retweeted_status?.largeImageURLs : largeImageURLs
    }

    // 用户模型
    var user: User?

    // 转发微博
    var retweeted_status: Status?

    // 类属性数组
    static let properties = ["created_at","id","text","source","pic_urls","user","retweeted_status"]

    // 字典转模型函数
    init(dict:[String: AnyObject]) {
        super.init()

        for key in Status.properties {

            // 判断字典中的KEY是否存在
            if dict[key] == nil || key == "user" || key == "retweeted_status"{
               continue
            }

            setValue(dict[key], forKey: key)
        }

        // 判断字典中是否包含 user
        if let userDict = dict["user"] as? [String: AnyObject] {
            // 给 user 属性设置数值
            user = User(dict: userDict)
        }

        // 判断字典中是否包含 retweeted_status
        if let retweetedDict = dict["retweeted_status"] as? [String: AnyObject] {

            retweeted_status = Status(dict: retweetedDict)
        }
    }

    override var description: String {

        let dict = dictionaryWithValuesForKeys(Status.properties)

        return "\(dict)"
    }

    /// 加载数据
    /**
        since_id    若指定此参数，则返回ID比since_id大的微博（即比since_id时间晚的微博），默认为0
        max_id      若指定此参数，则返回ID小于或等于max_id的微博，默认为0
    */
    class func loadStatus(since_id: Int, max_id: Int,finished: (statuses: [Status]?, error: NSError?) -> ()) {

        assert(sharedUserAccount != nil , "必须登陆后才能访问网络")


        var params = ["access_token": sharedUserAccount!.access_token]

        if since_id > 0 {
            params["since_id"] = "\(since_id)"
        }

        if max_id > 0 {

            params["since_id"] = "0"
            params["max_id"] = "\(max_id - 1)"
        }
        // 发起网络请求，异步加载数据
        NetWorkingTools.shareNetworkTools().GET(WB_Home_TimeLine_URL, parameters: params, success: { (_, JSON) -> Void in



            if let array = JSON["statuses"] as? [[String:AnyObject]]{

                // 获取微博模型的数组
                let list = statuses(array)

                // 异步缓存微博数组中的所有图像
                cacheWebImages(list, finised: finished)

                return
            }

            // 回调空数据，解析失败 等
            finished(statuses: nil, error: nil)

            
            }) { (_, error) -> Void in

                print(error)
                // 回调错误信息
                finished(statuses: nil, error: error)


        }
    }


    ///  缓存微博数组中的所有图像
    private class func cacheWebImages(list: [Status],finised: (statuses: [Status]?,error: NSError?) -> ()) {

        // 创建调度组
        let group = dispatch_group_create()

        // 遍历数组
        for s in list {

            // 判断 iamgeURLs 是否有内容
            if s.calPictureURLs == nil || s.calPictureURLs!.isEmpty {
                continue
            }

//            print(s.calPictureURLs)
            // 进一步遍历 calPictureURLs的数组，缓存数组中的图片
            for url in s.calPictureURLs! {

                // 进入调度组
                dispatch_group_enter(group)

                // 用sdwebimage 缓存图片 downloadimagewithurl 是SDWebImage 核心的图像下载函数
                SDWebImageManager.sharedManager().downloadImageWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (_, _, _, _, _) -> Void in

                        // 离开调度组
                        dispatch_group_leave(group)

                })
                    
            }
        }

        // 创建调度组通知
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in

            finised(statuses: list, error: nil)
        }

    }

    


    // 使用传入的数组，完成网络模型转 Status数组
    private class func statuses(array: [[String:AnyObject]]) -> [Status] {

        // 定义可变数组
        var arrayM = [Status]()

        // 遍历数组
        for dict in array {

            arrayM.append(Status(dict: dict))
        }

        return arrayM
    }
    

}
